#ifndef NODE_H
#define NODE_H

#include "..\mesinkata\mesinkata.h"
#include "..\Boolean\Boolean.h"
#include "..\LinkedListGeneralDefinition\LinkedListGeneralDefinition.h"
// #include <windows.h>


/**

NODE :
Representasi LinkedList - Pointer - Implisit

**/

struct NODE {
	string name;			// Nama dari Node  <== Key dari NodeList

	float retrieveTime; 	// waktu yang diperlukan untuk me-retrieve satu record
	float updateTime;		// waktu yang diperlukan untuk me-update satu record
	float insertTime;		// waktu yang diperlukan untuk me-insert satu record
	float deleteTime;		// waktu yang diperlukan untuk me-delete satu record
	
	bool hasClient;			// apakah node mempunyai klien?
	bool hasServer;			// apakah node mempunyai server?
	
	bool hasTMhs;			// apakah node mempunyai TabelMhs?
	bool hasTMK;			// apakah node mempunyai TabelMK?
	bool hasTPMK;			// apakah node mempunyai TabelPMK?
	
	struct NODE *next;
};

typedef struct NODE node;
typedef node* nodeAddress;

typedef nodeAddress nodeList;

// SELEKTOR
#define HAS_SERVER(node)	(node)->hasServer
#define HAS_CLIENT(node)	(node)->hasClient
#define HAS_TMHS(node)		(node)->hasTMhs
#define HAS_TMK(node)		(node)->hasTMK
#define HAS_TPMK(node)		(node)->hasTPMK
#define NODENAME(node)		(node)->name
#define RETRIEVETIME(node)	(node)->retrieveTime
#define UPDATETIME(node)	(node)->updateTime
#define INSERTTIME(node)	(node)->insertTime
#define DELETETIME(node)	(node)->deleteTime



// KONSTRUKTOR - DESTRUKTOR
nodeList 	CreateEmptyNodeList();
nodeAddress AllocateNode(string name, float retrieveTime, float updateTime, float insertTime, float deleteTime, bool hasClient, bool hasServer);
nodeAddress AllocateNodeAdv(string name, float retrieveTime, float updateTime, float insertTime, float deleteTime, bool hasClient, bool hasServer, nodeAddress next);
void		DeallocateNode(node *n);

// PREDIKAT
bool 		IsNodeEqual(nodeAddress A, nodeAddress B); // return IsStringEqual(A.name, B.name);

// OPERASI
void		ChangeNodeTableAvailability(nodeAddress node, bool hasTMhs_baru, bool hasTMK_baru, bool hasTPMK_baru);
/**********************************************************************************
	Mengupdate hasTMhs, hasTMK, dan hasTPMK dari node dengan data baru
**********************************************************************************/

nodeAddress SearchNodeByName(nodeList *NL, string name);
/**********************************************************************************
	Mencari node dengan nama name di dalam NL
	I.S. : 	sembarang
	F.S. : 	return address dari node dengan nama name jika ditemukan.
			return NULL jika tidak ditemukan
**********************************************************************************/ 

void		AddNode(nodeList *NL, nodeAddress node);
/**********************************************************************************
	Menambahkan node ke NL di tempat yang tepat
	I.S. : 	node sudah dialokasi
	F.S. : 	nodeList berisi node dan terurut membesar berdasarkan name
	Prekondisi : node dengan nama NODENAME(node) belum terdapat pada nodeList NL
**********************************************************************************/ 

void		DestroyNode(nodeList *NL, nodeAddress node);
/**********************************************************************************
	Mendealokasi node dari NL.
	I.S. : 	node ada di dalam NL
	F.S. : 	node tidak ada di dalam NL. node didealokasi.
**********************************************************************************/ 

void		DestroyNodeList(nodeList *NL);
/**********************************************************************************
	Mendealokasi semua node dari NL.
	I.S. : 	NL mungkin kosong
	F.S. : 	NL kosong dan semua node yang tadinya ada di NL didealokasi
**********************************************************************************/ 

// OUTPUT (PANDUAN : Pedoman Tubes 2 halaman 7)
void 		PrintNode(nodeAddress N);
/**********************************************************************************
	Mendampilkan ke layar isi dari node
	I.S. : 	node tidak kosong
	F.S. : 	informasi dari node ditampilkan ke layar dengan format
			<nama> <server> <client> <retrieve time> <insert time> <delete time> <update time>
			contoh
			A		Yes		No		0.3		0.4		0.1		0.1
			Hihi	Yes		Yes		0.2		0.4		0.12	0.33
			Lebar kolom : masing-masing 10
**********************************************************************************/ 

void		PrintNodeHeader();
/**********************************************************************************
	Mendampilkan header dari node
	I.S. : 	sembarang
	F.S. : 	informasi header ditampilkan ke layar persisi seperti ini :
			Site	Server		Client		Retrieve		Insert		Delete		Update
			Lebar kolom : masing-masing 10
**********************************************************************************/ 

#endif
